package com.hzhr.iot.cqgas.ds.service;

import com.hzhr.iot.core.constant.CommonOptions;
import com.hzhr.iot.core.util.HzhrDateUtil;
import com.hzhr.iot.core.util.HzhrTypeUtil;
import com.hzhr.iot.cqgas.ds.dao.device.example.DevIotDeviceDao;
import com.hzhr.iot.cqgas.ds.dao.device.example.DevIotDeviceTypeDao;
import com.hzhr.iot.cqgas.ds.dao.smartmeter.custom.SmDeviceCustomDao;
import com.hzhr.iot.cqgas.ds.dao.smartmeter.example.SmMeterDao;
import com.hzhr.iot.cqgas.ds.dao.smartmeter.example.SmNodeNetworkDao;
import com.hzhr.iot.cqgas.ds.dao.user.example.UsrCompanyDao;
import com.hzhr.iot.cqgas.ds.dao.user.example.UsrDeptDao;
import com.hzhr.iot.cqgas.ds.entity.device.DevIotDeviceEntity;
import com.hzhr.iot.cqgas.ds.entity.device.DevIotDeviceExample;
import com.hzhr.iot.cqgas.ds.entity.device.DevIotDeviceTypeEntity;
import com.hzhr.iot.cqgas.ds.entity.user.UsrCompanyEntity;
import com.hzhr.iot.cqgas.ds.entity.user.UsrDeptEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class IotDeviceService {
    @Autowired
    DevIotDeviceDao devIotDeviceDao;
    @Autowired
    SmMeterDao smMeterDao;
    @Autowired
    SmNodeNetworkDao smNodeNetworkDao;
    @Autowired
    SmDeviceCustomDao smDeviceCustomDao;
    @Autowired
    DevOptionsService devOptionsService;
    @Autowired
    DevIotDeviceTypeDao devIotDeviceTypeDao;
    @Autowired
    UsrCompanyDao usrCompanyDao;
    @Autowired
    UsrDeptDao usrDeptDao;

    @Value("${companyId}")
    String companyId;

    private Logger logger = LoggerFactory.getLogger(IotDeviceService.class);

    public void syncIotDevice(Date startDate, Date endDate) {
        int addCount = 0;
        int updateCount = 0;
        long start = new Date().getTime();

        Map<String, Object> criteriaMap = new HashMap<>();
        if (startDate != null) criteriaMap.put("startDate", HzhrDateUtil.dateToStr(startDate));
        if (endDate != null) criteriaMap.put("endDate", HzhrDateUtil.dateToStr(endDate));
        List<Map<String, Object>> iotdevices = smDeviceCustomDao.selectIotDevice(criteriaMap);

        String dtuCategoryCode = devOptionsService.getCode("IOT_DEVICE_CATEGORY", "DTU");
        String gprsCategoryCode = devOptionsService.getCode("IOT_DEVICE_CATEGORY", "GPRS_IOT_GAS_METER");
        String ccrCategoryCode = devOptionsService.getCode("IOT_DEVICE_CATEGORY", "CONCENTRATOR");
        String pulseCategoryCode = devOptionsService.getCode("IOT_DEVICE_CATEGORY", "PULSE_READING");
        String iotPlatformCode = devOptionsService.getCode("IOT_PLATFORM_TYPE", "SELF_BUILD");

        //查询出物联网设备类型
        List<DevIotDeviceTypeEntity> devIotDeviceTypeEntities = devIotDeviceTypeDao.selectByExample(null);
        Map<String, Integer> dtuIotDeviceTypes = new HashMap<>();
        Map<String, Integer> gprsIotDeviceTypes = new HashMap<>();
        Map<String, Integer> pulseIotDeviceTypes = new HashMap<>();
        Map<String, Integer> ccrIotDeviceTypes = new HashMap<>();
        for (DevIotDeviceTypeEntity devIotDeviceTypeEntity :
                devIotDeviceTypeEntities) {
            if (dtuCategoryCode.equals(devIotDeviceTypeEntity.getDeviceCategoryCode())) {
                dtuIotDeviceTypes.put(devIotDeviceTypeEntity.getOutId(), devIotDeviceTypeEntity.getId());
            } else if (gprsCategoryCode.equals(devIotDeviceTypeEntity.getDeviceCategoryCode())) {
                gprsIotDeviceTypes.put(devIotDeviceTypeEntity.getOutId(), devIotDeviceTypeEntity.getId());
            } else if (pulseCategoryCode.equals(devIotDeviceTypeEntity.getDeviceCategoryCode())) {
                pulseIotDeviceTypes.put(devIotDeviceTypeEntity.getOutId(), devIotDeviceTypeEntity.getId());
            } else if (ccrCategoryCode.equals(devIotDeviceTypeEntity.getDeviceCategoryCode())) {
                ccrIotDeviceTypes.put(devIotDeviceTypeEntity.getOutId(), devIotDeviceTypeEntity.getId());
            }
        }

        //查询部门
        List<UsrDeptEntity> usrDeptEntities = usrDeptDao.selectByExample(null);
        Map<String, UsrDeptEntity> userDepts = new HashMap<>();
        for (UsrDeptEntity userDeptEntity :
                usrDeptEntities) {
            userDepts.put(userDeptEntity.getCode(), userDeptEntity);
        }

        //查询公司
        List<UsrCompanyEntity> usrCompanyEntities = usrCompanyDao.selectByExample(null);
        Map<String, Integer> usrCompanys = new HashMap<>();
        for (UsrCompanyEntity usrCompanyEntity :
                usrCompanyEntities) {
            usrCompanys.put(usrCompanyEntity.getOutId(), usrCompanyEntity.getId());
        }

        for (Map<String, Object> iotdevice :
        iotdevices) {
            try {
                String nodeId = HzhrTypeUtil.object2string(iotdevice.get("NODE_ID"));
                String eqId = HzhrTypeUtil.object2string(iotdevice.get("EQ_ID"));
                String eqNo = HzhrTypeUtil.object2string(iotdevice.get("EQ_NO"));
                String des = HzhrTypeUtil.object2string(iotdevice.get("INSTALL_ADDR"));
                String mtId = HzhrTypeUtil.object2string(iotdevice.get("MT_ID"));
                String dtutId = HzhrTypeUtil.object2string(iotdevice.get("DTUT_ID"));
                String cctId = HzhrTypeUtil.object2string(iotdevice.get("CCT_ID"));
                String orgId = HzhrTypeUtil.object2string(iotdevice.get("ORG_ID"));
                String mPrId = HzhrTypeUtil.object2string(iotdevice.get("MPR_ID"));
                String dPrId = HzhrTypeUtil.object2string(iotdevice.get("DPR_ID"));
                String cPrId = HzhrTypeUtil.object2string(iotdevice.get("CPR_ID"));

                String deptCode = orgId.replace("0000", "9-01");
                String resourceCode = orgId.replace("0000", "01000901");

                //同步DTU
                if (dtutId != null) {
                    DevIotDeviceExample devIotDeviceExample = new DevIotDeviceExample();
                    devIotDeviceExample.createCriteria().andOutIdEqualTo(nodeId);
                    List<DevIotDeviceEntity> devIotDeviceEntities = devIotDeviceDao.selectByExample(devIotDeviceExample);

                    if (devIotDeviceEntities.size() > 0) {
                        DevIotDeviceEntity devIotDeviceEntity = devIotDeviceEntities.get(0);
                        devIotDeviceEntity.setOutId(nodeId);
                        devIotDeviceEntity.setCode(eqNo);
                        devIotDeviceEntity.setDes(des);
                        devIotDeviceEntity.setCategoryCode(dtuCategoryCode);
                        devIotDeviceEntity.setTypeId(dtuIotDeviceTypes.get(dtutId));

                        Integer iotCompanyId = usrCompanys.get(dPrId);
                        devIotDeviceEntity.setCompanyId(iotCompanyId != null ? iotCompanyId : 1);

                        UsrDeptEntity usrDeptEntity = userDepts.get(deptCode);
                        if (usrDeptEntity != null) {
                            devIotDeviceEntity.setDeptId(usrDeptEntity.getId());
                        } else {
                            devIotDeviceEntity.setDeptId(0);
                        }

                        devIotDeviceEntity.setGasCompanyId(Integer.parseInt(companyId));
                        devIotDeviceEntity.setIotPlatformCode(iotPlatformCode);
                        devIotDeviceEntity.setIotPlatformDeviceId(eqNo);
                        devIotDeviceEntity.setUpdateTime(new Date());
                        devIotDeviceEntity.setUpdateUserId(0);
                        devIotDeviceEntity.setResourceCode(resourceCode);
                        devIotDeviceEntity.setIsValid(CommonOptions.YES_NO.YES);
                        devIotDeviceEntity.setState("1");
                        devIotDeviceDao.updateByPrimaryKey(devIotDeviceEntity);

                        updateCount++;
                    } else {
                        DevIotDeviceEntity devIotDeviceEntity = new DevIotDeviceEntity();
                        devIotDeviceEntity.setOutId(nodeId);
                        devIotDeviceEntity.setCode(eqNo);
                        devIotDeviceEntity.setDes(des);
                        devIotDeviceEntity.setCategoryCode(dtuCategoryCode);
                        devIotDeviceEntity.setTypeId(dtuIotDeviceTypes.get(dtutId));

                        Integer iotCompanyId = usrCompanys.get(dPrId);
                        devIotDeviceEntity.setCompanyId(iotCompanyId != null ? iotCompanyId : 1);

                        UsrDeptEntity usrDeptEntity = userDepts.get(deptCode);
                        if (usrDeptEntity != null) {
                            devIotDeviceEntity.setDeptId(usrDeptEntity.getId());
                        } else {
                            devIotDeviceEntity.setDeptId(0);
                        }

                        devIotDeviceEntity.setGasCompanyId(Integer.parseInt(companyId));
                        devIotDeviceEntity.setIotPlatformCode(iotPlatformCode);
                        devIotDeviceEntity.setIotPlatformDeviceId(eqNo);
                        devIotDeviceEntity.setCreateTime(new Date());
                        devIotDeviceEntity.setCreateUserId(0);
                        devIotDeviceEntity.setResourceCode(resourceCode);
                        devIotDeviceEntity.setIsValid(CommonOptions.YES_NO.YES);
                        devIotDeviceEntity.setState("1");
                        devIotDeviceDao.insert(devIotDeviceEntity);
                        addCount++;
                    }
                }

                //同步GPRS物联网表
                if (mtId != null && !eqNo.startsWith("2066")) {
                    DevIotDeviceExample devIotDeviceExample = new DevIotDeviceExample();
                    devIotDeviceExample.createCriteria().andOutIdEqualTo(nodeId);
                    List<DevIotDeviceEntity> devIotDeviceEntities = devIotDeviceDao.selectByExample(devIotDeviceExample);

                    if (devIotDeviceEntities.size() > 0) {
                        DevIotDeviceEntity devIotDeviceEntity = devIotDeviceEntities.get(0);
                        devIotDeviceEntity.setOutId(nodeId);
                        devIotDeviceEntity.setCode(eqNo);
                        devIotDeviceEntity.setDes(des);
                        devIotDeviceEntity.setCategoryCode(gprsCategoryCode);
                        devIotDeviceEntity.setTypeId(gprsIotDeviceTypes.get(mtId));

                        Integer iotCompanyId = usrCompanys.get(mPrId);
                        devIotDeviceEntity.setCompanyId(iotCompanyId != null ? iotCompanyId : 1);

                        UsrDeptEntity usrDeptEntity = userDepts.get(deptCode);
                        if (usrDeptEntity != null) {
                            devIotDeviceEntity.setDeptId(usrDeptEntity.getId());
                        } else {
                            devIotDeviceEntity.setDeptId(0);
                        }

                        devIotDeviceEntity.setGasCompanyId(Integer.parseInt(companyId));
                        devIotDeviceEntity.setIotPlatformCode(iotPlatformCode);
                        devIotDeviceEntity.setIotPlatformDeviceId(eqNo);
                        devIotDeviceEntity.setUpdateTime(new Date());
                        devIotDeviceEntity.setUpdateUserId(0);
                        devIotDeviceEntity.setResourceCode(resourceCode);
                        devIotDeviceEntity.setIsValid(CommonOptions.YES_NO.YES);
                        devIotDeviceEntity.setState("1");
                        devIotDeviceDao.updateByPrimaryKey(devIotDeviceEntity);
                        updateCount++;
                    } else {
                        DevIotDeviceEntity devIotDeviceEntity = new DevIotDeviceEntity();
                        devIotDeviceEntity.setOutId(nodeId);
                        devIotDeviceEntity.setCode(eqNo);
                        devIotDeviceEntity.setDes(des);
                        devIotDeviceEntity.setCategoryCode(gprsCategoryCode);
                        devIotDeviceEntity.setTypeId(gprsIotDeviceTypes.get(mtId));

                        Integer iotCompanyId = usrCompanys.get(mPrId);
                        devIotDeviceEntity.setCompanyId(iotCompanyId != null ? iotCompanyId : 1);

                        UsrDeptEntity usrDeptEntity = userDepts.get(deptCode);
                        if (usrDeptEntity != null) {
                            devIotDeviceEntity.setDeptId(usrDeptEntity.getId());
                        } else {
                            devIotDeviceEntity.setDeptId(0);
                        }

                        devIotDeviceEntity.setGasCompanyId(Integer.parseInt(companyId));
                        devIotDeviceEntity.setIotPlatformCode(iotPlatformCode);
                        devIotDeviceEntity.setIotPlatformDeviceId(eqNo);
                        devIotDeviceEntity.setCreateTime(new Date());
                        devIotDeviceEntity.setCreateUserId(0);
                        devIotDeviceEntity.setResourceCode(resourceCode);
                        devIotDeviceEntity.setIsValid(CommonOptions.YES_NO.YES);
                        devIotDeviceEntity.setState("1");
                        devIotDeviceDao.insert(devIotDeviceEntity);
                        addCount++;

                    }
                }

                //同步脉冲直读
                if (mtId != null && eqNo.startsWith("2066")) {
                    DevIotDeviceExample devIotDeviceExample = new DevIotDeviceExample();
                    devIotDeviceExample.createCriteria().andOutIdEqualTo(nodeId);
                    List<DevIotDeviceEntity> devIotDeviceEntities = devIotDeviceDao.selectByExample(devIotDeviceExample);

                    if (devIotDeviceEntities.size() > 0) {
                        DevIotDeviceEntity devIotDeviceEntity = devIotDeviceEntities.get(0);
                        devIotDeviceEntity.setOutId(nodeId);
                        devIotDeviceEntity.setCode(eqNo);
                        devIotDeviceEntity.setDes(des);
                        devIotDeviceEntity.setCategoryCode(pulseCategoryCode);
                        devIotDeviceEntity.setTypeId(pulseIotDeviceTypes.get(mtId));

                        Integer iotCompanyId = usrCompanys.get(mPrId);
                        devIotDeviceEntity.setCompanyId(iotCompanyId != null ? iotCompanyId : 1);

                        UsrDeptEntity usrDeptEntity = userDepts.get(deptCode);
                        if (usrDeptEntity != null) {
                            devIotDeviceEntity.setDeptId(usrDeptEntity.getId());
                        } else {
                            devIotDeviceEntity.setDeptId(0);
                        }

                        devIotDeviceEntity.setGasCompanyId(Integer.parseInt(companyId));
                        devIotDeviceEntity.setIotPlatformCode(iotPlatformCode);
                        devIotDeviceEntity.setIotPlatformDeviceId(eqNo);
                        devIotDeviceEntity.setUpdateTime(new Date());
                        devIotDeviceEntity.setUpdateUserId(0);
                        devIotDeviceEntity.setResourceCode(resourceCode);
                        devIotDeviceEntity.setIsValid(CommonOptions.YES_NO.YES);
                        devIotDeviceEntity.setState("1");
                        devIotDeviceDao.updateByPrimaryKey(devIotDeviceEntity);
                        updateCount++;
                    } else {
                        DevIotDeviceEntity devIotDeviceEntity = new DevIotDeviceEntity();
                        devIotDeviceEntity.setOutId(nodeId);
                        devIotDeviceEntity.setCode(eqNo);
                        devIotDeviceEntity.setDes(des);
                        devIotDeviceEntity.setCategoryCode(pulseCategoryCode);
                        devIotDeviceEntity.setTypeId(pulseIotDeviceTypes.get(mtId));

                        Integer iotCompanyId = usrCompanys.get(mPrId);
                        devIotDeviceEntity.setCompanyId(iotCompanyId != null ? iotCompanyId : 1);

                        UsrDeptEntity usrDeptEntity = userDepts.get(deptCode);
                        if (usrDeptEntity != null) {
                            devIotDeviceEntity.setDeptId(usrDeptEntity.getId());
                        } else {
                            devIotDeviceEntity.setDeptId(0);
                        }

                        devIotDeviceEntity.setGasCompanyId(Integer.parseInt(companyId));
                        devIotDeviceEntity.setIotPlatformCode(iotPlatformCode);
                        devIotDeviceEntity.setIotPlatformDeviceId(eqNo);
                        devIotDeviceEntity.setCreateTime(new Date());
                        devIotDeviceEntity.setCreateUserId(0);
                        devIotDeviceEntity.setResourceCode(resourceCode);
                        devIotDeviceEntity.setIsValid(CommonOptions.YES_NO.YES);
                        devIotDeviceEntity.setState("1");
                        devIotDeviceDao.insert(devIotDeviceEntity);
                        addCount++;
                    }
                }

                //同步集中器
                if (cctId != null) {
                    DevIotDeviceExample devIotDeviceExample = new DevIotDeviceExample();
                    devIotDeviceExample.createCriteria().andOutIdEqualTo(nodeId);
                    List<DevIotDeviceEntity> devIotDeviceEntities = devIotDeviceDao.selectByExample(devIotDeviceExample);

                    if (devIotDeviceEntities.size() > 0) {
                        DevIotDeviceEntity devIotDeviceEntity = devIotDeviceEntities.get(0);
                        devIotDeviceEntity.setOutId(nodeId);
                        devIotDeviceEntity.setCode(eqNo);
                        devIotDeviceEntity.setDes(des);
                        devIotDeviceEntity.setCategoryCode(ccrCategoryCode);
                        devIotDeviceEntity.setTypeId(ccrIotDeviceTypes.get(cctId));

                        Integer iotCompanyId = usrCompanys.get(cPrId);
                        devIotDeviceEntity.setCompanyId(iotCompanyId != null ? iotCompanyId : 1);

                        UsrDeptEntity usrDeptEntity = userDepts.get(deptCode);
                        if (usrDeptEntity != null) {
                            devIotDeviceEntity.setDeptId(usrDeptEntity.getId());
                        } else {
                            devIotDeviceEntity.setDeptId(0);
                        }

                        devIotDeviceEntity.setGasCompanyId(Integer.parseInt(companyId));
                        devIotDeviceEntity.setIotPlatformCode(iotPlatformCode);
                        devIotDeviceEntity.setIotPlatformDeviceId(eqNo);
                        devIotDeviceEntity.setUpdateTime(new Date());
                        devIotDeviceEntity.setUpdateUserId(0);
                        devIotDeviceEntity.setResourceCode(resourceCode);
                        devIotDeviceEntity.setIsValid(CommonOptions.YES_NO.YES);
                        devIotDeviceEntity.setState("1");
                        devIotDeviceDao.updateByPrimaryKey(devIotDeviceEntity);
                        updateCount++;
                    } else {
                        DevIotDeviceEntity devIotDeviceEntity = new DevIotDeviceEntity();
                        devIotDeviceEntity.setOutId(nodeId);
                        devIotDeviceEntity.setCode(eqNo);
                        devIotDeviceEntity.setDes(des);
                        devIotDeviceEntity.setCategoryCode(ccrCategoryCode);
                        devIotDeviceEntity.setTypeId(ccrIotDeviceTypes.get(cctId));

                        Integer iotCompanyId = usrCompanys.get(cPrId);
                        devIotDeviceEntity.setCompanyId(iotCompanyId != null ? iotCompanyId : 1);


                        UsrDeptEntity usrDeptEntity = userDepts.get(deptCode);
                        if (usrDeptEntity != null) {
                            devIotDeviceEntity.setDeptId(usrDeptEntity.getId());
                        } else {
                            devIotDeviceEntity.setDeptId(0);
                        }

                        devIotDeviceEntity.setGasCompanyId(Integer.parseInt(companyId));
                        devIotDeviceEntity.setIotPlatformCode(iotPlatformCode);
                        devIotDeviceEntity.setIotPlatformDeviceId(eqNo);
                        devIotDeviceEntity.setCreateTime(new Date());
                        devIotDeviceEntity.setCreateUserId(0);
                        devIotDeviceEntity.setResourceCode(resourceCode);
                        devIotDeviceEntity.setIsValid(CommonOptions.YES_NO.YES);
                        devIotDeviceEntity.setState("1");
                        devIotDeviceDao.insert(devIotDeviceEntity);
                        addCount++;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        long end = new Date().getTime();
        logger.info("同步物联网设备结束: " + (end - start) / 1000 + "s");
        logger.info("同步时间: " + (end - start) / 1000 + "s");
        logger.info("更新数量: " + updateCount + "条");
        logger.info("新增数量: " + addCount + "条");
    }

}
